home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / presto / presto10.lha / src / misc.C < prev    next >
C/C++ Source or Header  |  1991-12-11  |  2KB  |  136 lines

  1. /*
  2.  *    misc.c
  3.  *
  4.  *     General mishmash that doesn't belong anywhere else
  5.  *    - fatalerror()        -- abort and die horribly
  6.  *    - overloaded new and delete
  7.  */ 
  8.  
  9. #define _MISC_C
  10.  
  11. #include <stream.h>
  12. #include <osfcn.h>
  13. #include "presto.h"
  14. #include <stdio.h>
  15.  
  16. #ifdef __DECCXX
  17. #define malloc_t void*
  18. #define malloc_arg size_t
  19. #else
  20. #define malloc_t char*
  21. #define malloc_arg unsigned
  22. #endif
  23.  
  24. void
  25. error(char *s)
  26. {
  27.     cerr << s << "\n";
  28.     fatalerror();
  29. }
  30.  
  31. void
  32. fatalerror()
  33. {
  34.     cerr << "Aborting....\n";
  35.     cout.flush();
  36.     cerr.flush();
  37.     abort();
  38. }
  39.  
  40. //
  41. // We have to redefine the new and delete functions so they malloc
  42. // in shared memory.
  43. //
  44.  
  45. typedef void (*PFVV)();
  46.  
  47. extern PFVV _new_handler;
  48.  
  49. typedef malloc_t    (*PFUC)(malloc_arg);            // for malloc
  50. typedef void        (*PFVC)(malloc_t);        // for free
  51.  
  52. //
  53. // The memory allocator should be called "malloc" in all
  54. // Presto versions.  That prevents the c-library malloc from being
  55. // linked in and called accidentally.  A call to the c-library
  56. // malloc will cause Topaz Presto to get blown out of the water.
  57. //
  58. #define MALLOC(x)        malloc(x)
  59. #define FREE(x)            free(x)
  60. PFUC    mallocf = malloc;
  61. PFVC    freef = (PFVC) free;
  62.  
  63. extern void* operator new(size_t size)
  64. {
  65.     malloc_t p;
  66.  
  67.     while ( (p=MALLOC((malloc_arg) size))==0 ) {
  68. #ifndef __DECCXX
  69.         if(_new_handler)
  70.             (*_new_handler)();
  71.         else    
  72. #endif /* __DECCXX */
  73.             return 0;
  74.     }
  75.     return (void*)p;
  76. }
  77.  
  78.  
  79. extern void operator delete(void* p)
  80. {
  81.     if (p) FREE((malloc_t) p);
  82. }
  83.  
  84. //
  85. // Dangerous: If you do a set_{malloc/free}_agent from shared to non-shared
  86. // or the other way around, anything which has been malloced in one
  87. // form might get demalloced in another.  Of course, the classes
  88. // can remember this for themselves and make sure to set the
  89. // types correctly.
  90.  
  91. PFUC
  92. set_malloc_agent(PFUC nmalloc)
  93. {
  94.     PFUC omalloc = mallocf;
  95.  
  96.     mallocf = nmalloc;
  97.     return omalloc;
  98. }
  99.  
  100. PFVC
  101. set_free_agents(PFVC nfree)
  102. {
  103.     PFVC ofree = freef;
  104.     freef = nfree;
  105.     return ofree;
  106. }
  107.  
  108. void failed_malloc()
  109. {
  110.         write (1, "failed malloc\n", 14); 
  111. //    cerr << "operator new failed: out of store\n";
  112.     fatalerror();
  113. }
  114.  
  115. void
  116. thisthread_holdingspinlock()
  117. {
  118.     thisthread->holdingspinlock();
  119. }
  120.  
  121. void
  122. thisthread_releasingspinlock()
  123. {
  124.     thisthread->releasingspinlock();
  125. }
  126.  
  127.  
  128. #if defined(sun) || defined(vax) || defined(mips)
  129.  
  130. int cpus_online() { return 1; }
  131. malloc_t shmalloc(size_t s) { return malloc(s); }
  132. void shfree(char* x) { free(x); }
  133.  
  134. #endif /* sun||vax||mips */
  135.  
  136.